/** ***********************************************************************************
* @file         mon_task.h
* @brief        系统监控管理任务头文件
* @details      主要是用来监控系统任务的状态、系统的内存状态、系统运行状态等操作；
* @author       杨小珛
* @date         2020/12/27
* @copyright    北京高知科技有限公司    
* @version      V1.0
* @attention    无
**************************************************************************************/
#ifndef MON_TASK_H
#define MON_TASK_H
/* Standard includes. */
#include "os_app.h"

/****************************************************************************************
* 系统唤醒方式接口
******************************************************************************************/
#define SYS_WAKEUP_QUEUE_DEPTH      ( 5 )

#define SYS_WAKEUP_TRIG_RTC     ( 0x00000001 )    /* 1 RTC中断触发唤醒 */
#define SYS_WAKEUP_TRIG_KL15    ( 0x00000002 )    /* 2 KL15中断事件唤醒 */
#define SYS_WAKEUP_TRIG_BLE     ( 0x00000004 )    /* 3 蓝牙接口事件唤醒 */
#define SYS_WAKEUP_TRIG_CAN     ( 0x00000008 )    /* 4 CAN总线事件唤醒*/
#define SYS_WAKEUP_TRIG_GSEN    ( 0x00000010 )    /* 5 GSEN中断事件唤醒 */
#define SYS_WAKEUP_TRIG_NET     ( 0x00000020 )    /* 6 NET中断事件唤醒 */
#define SYS_WAKEUP_TRIG_TIME    ( 0x00000040 )    /* 7 TIME中断事件唤醒 */

typedef enum
{
    RTC_NET = 0x00,
    RTC_VEH,          
} system_rtc_wakeup_t;

#define SYSTEM_WAKEUP_TIMER_NUM ( 2 )

typedef enum
{
    WAKEUP_INIT = 0x00,
    WAKEUP_START,          
}system_wakeup_timer_e;

typedef  struct
{   
    system_wakeup_timer_e timer;
    uint32_t handle;
    uint32_t counter;
}system_wakeup_timer_t;

/****************************************************************************************
* 系统LED灯的状态
******************************************************************************************/
#define     SYS_NET_LED_POWER_PIN    ( 4 ) /*NET状态LED灯控制口*/
#define     SYS_GNSS_LED_POWER_PIN   ( 5 ) /*GNSS状态LED灯控制口*/

typedef enum
{
    LED_OPEN = 0x00,      /*LED 打开*/
    LED_ABNORMAL,         /*LED 异常*/
    LED_NORMAL,           /*LED 正常*/
    LED_CLOSE,            /*LED 关闭*/
    LED_WANKEUP,          /*LED 唤醒*/
} system_led_mode_s;

/*-------------------------------------------------------------------------
                       终端系统状态(System status)
  -----------------------------------------------------------------------*/

typedef enum
{
    SYS_ST_INIT = 0x00,
    SYS_ST_START,        ///< 系统启动
    
    SYS_ST_RUN,          ///< 正常运行
    SYS_ST_SLEEP,        ///< 睡眠状态
    SYS_ST_STOP,         ///< 省电状态
    
    SYS_ST_WAKE,         ///< 唤醒状态
} system_work_mode_s;

/****************************************************************************************
* 定义任务看门狗类型
******************************************************************************************/
typedef  struct
{
   uint32_t      task_id;
   uint32_t      task_last_time;
   uint32_t      task_time_out;
   uint8_t       *task_name;
   GaozSemaphoreHandle_t task_semaphore;
}task_dog_typedef;
extern task_dog_typedef task_dog_t[];

typedef enum
{
    TASK_SEM_NO = 0x00,
    TASK_SEM_YES,
} task_dog_sem_e;

/*--------------------------------------------------------------------------
                          系统硬件状态枚举类型
---------------------------------------------------------------------------*/
typedef enum
{   
    SYS_POWER_INIT  = 0x00,
    SYS_POWER_ON,                ///< 系统主电已上电
    SYS_POWER_OFF,               ///< 系统主电未上电
} system_power_e;

typedef enum
{
    VEH_POWER_INIT  = 0x0,
    VEH_POWER_NORMAL,           ///< 车辆电源电压正常
    VEH_POWER_UNDER,            ///< 车辆电源电压欠压   
} vehicle_power_e;

typedef enum
{   
    SYS_BAT_INIT = 0x00,
    SYS_BAT_NORMAL,             ///< 备用电池正常
    SYS_BAT_FAULE,              ///< 备用电池异常
    SYS_BAT_CHARGING,           ///< 备用电池充电中
    SYS_BAT_DISCHARG,           ///< 备用电池放电中
} system_battery_e;

typedef enum
{   
    SYS_RTC_INIT = 0x00,
    SYS_RTC_ERR,                ///< RTC时钟芯片失败
    SYS_RTC_OK,                 ///< GSM模块网络注册时间
} system_rtc_e;

typedef enum
{   
    SYS_GPS_INIT = 0x00,
    SYS_GPS_NORMAL,             ///< GPS模块正常
    SYS_GPS_FAULE,              ///< GPS模块故障
    SYS_GPS_POS_OK,             ///< GPS定位正常
    SYS_GPS_POS_ERR,            ///< GPS定位异常
    SYS_GPS_UART_ERR,           ///< GPS串口无数据输出
} system_gps_e;

typedef enum
{   
    SYS_GPRS_INIT = 0x00,
    SYS_GPRS_NORMAL,             ///< GPRS模块正常
    SYS_GPRS_FAULE,              ///< GPS模块异常
    SYS_GPRS_NET_ERR,            ///< GPRS模块网络异常
    SYS_GPRS_NET_OK,             ///< GPRS模块网络正常
} system_gprs_e;


typedef enum
{   
    SYS_GSEN_INIT = 0x00,
    SYS_GSEN_NORMAL,             ///< 三轴传感器模块正常
    SYS_GSEN_FAULE,              ///< 三轴传感器模块故障
} system_Gsen_e;

typedef enum
{   
    SYS_CAN_INIT  = 0x00,
    SYS_CAN_NORMAL,             ///< CAN 网络正常
    SYS_CAN_FAULE,              ///< CAN 网络故障
    SYS_CAN_RUN,                ///< CAN 网络运行
    SYS_CAN_SLEEP,              ///< CAN 网络休眠
    SYS_CAN_STOP,               ///< CAN 网络停止
} system_can_e;

typedef enum
{   
    SYS_FLASH_INIT = 0x00,
    SYS_FLASH_NORMAL,           ///< FLASH状态正常
    SYS_FLASH_FAULE,            ///< FLASH状态故障
} system_flash_e;

typedef enum
{   
    SYS_BLE_INIT = 0x00,
    SYS_BLE_NORMAL,               ///< FLASH状态正常
    SYS_BLE_FAULE,                ///< FLASH状态故障
} system_ble_e;

typedef enum
{   
    SYS_SIM_INIT = 0x00,
    SYS_SIM_NORMAL,               ///<SIM状态正常
    SYS_SIM_FAULE,                ///< SIM状态故障
} system_sim_e;

typedef enum
{   
    SYS_TIMER_INIT = 0x00,
    SYS_TIMER_NORMAL,            ///<SIM状态正常
    SYS_TIMER_FAULE,             ///< SIM状态故障
} system_timer_e;


typedef enum
{
    SYS_VEHCILE_STATE_NORMAL = 0x00,
    SYS_VEHICLE_STATE_ACC_NO_OFF,//车辆状态 ACC 10MIN未关 未动
    SYS_VEHICLE_STATE_ENG_START_NOT_RUN,//车辆状态 发动机启动 30MIN未行驶
}system_vehicle_warning_e;

/*--------------------------------------------------------------------------
                          系统硬件状态
---------------------------------------------------------------------------*/
typedef enum
{   
    SYS_POWER = 0x00,
    SYS_VEHICLE,
    SYS_BAT,
    SYS_RTC,
    SYS_GPS,
    SYS_GPRS,
    SYS_GSEN,
    SYS_CAN,
    SYS_FLASH,
    SYS_BLE,
    SYS_SIM,
    SYS_TIMER,
    SYS_VEHICLE_READY,
    SYS_VEHICLE_ACC,
}system_hardware_e;

typedef struct
{
    system_power_e  sys_power_s;    ///< 主电断电状态 
    vehicle_power_e veh_power_s;    ///< 车辆电源状态
    system_battery_e sys_bat_s;     ///< 内部电池状态
    system_rtc_e sys_rtc_s;         ///< 系统时钟状态
    system_gps_e sys_gps_s;         ///< 系统GPS状态
    system_gprs_e sys_gprs_s;       ///< 系统GPRS模块状态
    system_Gsen_e sys_gsen_s;       ///< 系统三轴加速度传感器状态
    system_can_e sys_can_s;         ///< 系统CAN网络状态
    system_flash_e sys_flash_s;     ///< 外部flash状态
    system_ble_e system_ble_s;      ///< 系统BLE状态
    system_sim_e system_sim_s;      ///< 系统SIM状态
    system_timer_e sys_timer_s;     ///< 系统定时器状态
    system_vehicle_warning_e sys_vehicle_acc_s;//车辆状态 ACC未关 或 启动未行驶
    system_vehicle_warning_e sys_vehicle_ready_s;//车辆状态 ACC未关 或 启动未行驶
}system_hardware_s;         

/*--------------------------------------------------------------------------
                     系统开关量状态枚举类型
---------------------------------------------------------------------------*/
typedef enum
{   
    SYS_KL15_INIT  = 0x00,
    SYS_KL15_LOW,    
    SYS_KL15_HIGH,   
} system_kl15_e;

typedef enum
{   
    SYS_WVEH_INIT  = 0x00,
    SYS_WVEH_START,    
    SYS_WVEH_STOP,
} system_wveh_e;

typedef enum
{   
    SYS_WCAN_INIT = 0x00,
    SYS_WCAN_WAKE,
    SYS_WCAN_RUN,
    SYS_WCAN_SLEEP,

    SYS_WCAN_SLEEPING,
} system_wcan_e;

typedef enum
{   
    SYS_WRTC_INIT = 0x00,
    SYS_WRTC_WAKE,
    SYS_WRTC_RUN,
    SYS_WRTC_SLEEP,

    SYS_WRTC_SLEEPING,
} system_wrtc_e;

typedef enum
{   
    SYS_WNET_INIT = 0x00,
    SYS_WNET_WAKE,
    SYS_WNET_RUN,
    SYS_WNET_SLEEP,

    SYS_WNET_SLEEPING,
} system_wnet_e;

typedef enum
{   
    SYS_WBLE_INIT = 0x00,
    SYS_WBLE_WAKE,
    SYS_WBLE_RUN,
    SYS_WBLE_SLEEP,

    SYS_WBLE_SLEEPING,
} system_wble_e;

typedef enum
{   
    SYS_WGSEN_INIT = 0x00,
    SYS_WGSEN_WAKE,
    SYS_WGSEN_RUN,
    SYS_WGSEN_SLEEP,

    SYS_WGSEN_SLEEPING,
} system_wgsen_e;

typedef enum
{   
    SYS_WTIME_INIT = 0x00,
    SYS_WTIME_WAKE,
    SYS_WTIME_RUN,
    SYS_WTIME_SLEEP,

    SYS_WTIME_SLEEPING,
} system_wtime_e;

/*--------------------------------------------------------------------------
                          系统开关量状态
---------------------------------------------------------------------------*/
#define SYS_WAKEUP_SOURCE_NUM ( 6 )

typedef enum
{
    SYS_KL15 = 0x00,
    SYS_WVEH,
    SYS_WCAN,
    SYS_WRTC,
    SYS_WNET,
    SYS_WBLE,
    SYS_WGSEN,
    SYS_WTIME,
}system_witch_e;

typedef struct
{
    system_kl15_e sys_kl15_s;     ///< KL15 系统状态
    system_wveh_e sys_wveh_s;     ///< VEH 车身状态
    system_wcan_e sys_wcan_s;     ///< CAN 唤醒接口
    system_wrtc_e sys_wrtc_s;     ///< RTC 唤醒接口
    system_wnet_e sys_wnet_s;     ///< NET 唤醒接口
    system_wble_e sys_wble_s;     ///< BLE 唤醒接口
    system_wgsen_e sys_wgsen_s;   ///< GSEN 唤醒接口
    system_wtime_e sys_wtime_s;   ///< 
}system_switch_s;

/*--------------------------------------------------------------------------
                          系统状态
---------------------------------------------------------------------------*/
typedef enum
{   
    SYS_RUN_INIT = 0x00,
    SYS_RUN_YES,                ///< 车辆行驶中
    SYS_RUN_NO,                 ///< 车辆停车
} system_run_e;

typedef enum
{   
    SYS_REG_INIT = 0x00,
    SYS_REG_NO,                 ///< 终端位注册
    SYS_REG_YES,                ///< 终端已注册
} system_reg_e;

typedef enum
{   
    SYS_LAND_INIT = 0x00,
    SYS_LAND_NO,                ///< 终端未注册
    SYS_LADN_YES,               ///< 终端以注册
} system_land_e;

typedef enum
{   
    SYS_OTA_INIT = 0x00,
    SYS_OTA_UPGRADE,            ///< 远程升级正在执行   
    SYS_OTA_STOP,               ///< 远程升级停止
    SYS_OTA_RESET,              ///< 远程升级已经完成主动复位系统
    SYS_OTA_BOOT_OK,            ///< 远程升级成功
    SYS_OTA_BOOT_ERR,           ///< 远程升级失败
} system_ota_e;

typedef enum
{   
    SYS_POS_MODE_INIT = 0x00,
    SYS_POS_MODE_GPS,           ///< GPS 硬件定位
    SYS_POS_MODE_LBS,           ///< LBS 基于基站的定位
} system_pos_mode_e;

/*系统状态的枚举类型*/
typedef enum
{   
    SYS_RUN = 0x00,
    SYS_REG,
    SYS_LAND,
    SYS_OTA,
    SYS_POS,
}system_state_e;

typedef struct
{
    system_run_e sys_run_s;          ///< 车辆行驶的状态
    system_reg_e sys_reg_s;          ///< 终端注册平台状态
    system_land_e sys_land_s;        ///< 终端登陆平台状态
    system_ota_e sys_ota_s;          ///< 系统升级状态
    system_pos_mode_e sys_pos_s;     ///< 系统定位方式
}system_state_s;

/*****************************************************************************************
        系统当前状态结构体(System current status information)
******************************************************************************************/
typedef struct
{
    system_hardware_s sys_hard_s;   
    system_switch_s sys_switch_s;
    system_state_s sys_state_s;
    system_work_mode_s sys_work_s;     
} system_run_state_s;

/*--------------------------------------------------------------------------
                          系统异常复位 枚举类型
---------------------------------------------------------------------------*/
#define SYS_RST_TIME_MS ( 604800 ) /*7*24*60*60*/

typedef enum
{   
    SYS_RESET_INIT = 0x00,      /*系统复位状态初始化*/
    
    SYS_RESET_NET,              /*系统网络异常，产生后立即复位*/
    SYS_RESET_MEM,              /*系统内存异常，产生后立即复位*/
    SYS_RESET_TASK,             /*系统任务异常，产生后立即复位*/
    SYS_RESET_APP,              /*应用层重新启动系统*/
    SYS_RESET_GPS,              /*GPS定位异常，产生后立即复位，仅限于千寻高精度定位模块*/
    SYS_RESET_SYS,              /*系统运行异常，当系统需要休眠时，没有成功进入休眠状态*/

    SYS_RESET_RUN,              /*系统运行总时间到达设定时间，系统复位在车辆正常停止后进行操作*/
    
}system_abnormal_reset_e;

/*--------------------------------------------------------------------------
                          系统异常阻塞 枚举类型
---------------------------------------------------------------------------*/
typedef enum
{   
    SYS_RESUME = 0x00,      /*系统释放*/
    SYS_SUSPEND,            /*系统阻塞*/
}system_block_mark_e;


/** ****************************************************************************
* @remarks       void mon_create_task( unsigned portBASE_TYPE uxPriority )
* @brief         创建系统监听任务以及初始化数据
* @param[in]     uxPriority 优先级
* @param[out]    无
* @return        无
* @attention     在系统启动后进行创建
*******************************************************************************/
extern void mon_create_task( unsigned portBASE_TYPE uxPriority );

/** ****************************************************************************
* @remarks       uint32_t mon_reg_task_dog( uint32_t  time_out , uint8_t * name ,task_dog_sem_e sem )
* @brief         注册喂狗事件
* @param[in]     TimeOutS 喂狗时间 单位s
* @param[in]     *name 注册任务的名称
* @param[out]    无
* @return        pdPASS 注册成功 ，pdFAIL注册失败
* @attention     无
*******************************************************************************/
extern uint32_t mon_reg_task_dog( uint32_t  time_out , uint8_t *name ,task_dog_sem_e sem );

/** ****************************************************************************
* @remarks       uint32_t mon_remove_task_dog(void)
* @brief         删除监控看门狗
* @param[in]     无
* @param[out]    无
* @return        pdFAIL 删除失败 pdPASS 删除成功
* @attention     必须在任务中使用
*******************************************************************************/
extern uint32_t mon_remove_task_dog(void);

/** ****************************************************************************
* @remarks       uint32_t mon_reset_task_dog( void )
* @brief         复位看门狗时间
* @param[in]     无
* @param[out]    无
* @return        pdFAIL 复位失败 pdPASS 复位成功
* @attention     必须在任务中使用
*******************************************************************************/
extern uint32_t mon_reset_task_dog( void );

/** ****************************************************************************
* @remarks       uint8_t sys_hard_state_get(system_hardware_e hard_id )
* @brief         获取系统的硬件状态
* @param[in]     hara_id 获取硬件状态的ID 
* @param[out]    无
* @return        data_out 输出针对状态的数据
* @attention     无
*******************************************************************************/
extern uint8_t sys_hard_state_get(system_hardware_e hard_id );

/** ****************************************************************************
* @remarks       void sys_hard_state_set(system_hardware_e hara_id ,uint8_t data_in)
* @brief         设置系统的硬件状态
* @param[in]     hara_id 获取硬件状态的ID 
* @param[in]     data_in 设置的指定状态的数据
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void sys_hard_state_set(system_hardware_e hara_id ,uint8_t data_in);

/** ****************************************************************************
* @remarks       uint8_t sys_switch_state_get(system_witch_e switch_id )
* @brief         获取硬件的开关状态
* @param[in]     switch_id 获取硬件状态的ID 
* @param[out]    无
* @return        返回指定状态的数据
* @attention     无
*******************************************************************************/
extern uint8_t sys_switch_state_get(system_witch_e switch_id );

/** ****************************************************************************
* @remarks       void sys_switch_state_set(system_witch_e switch_id ,uint8_t data_in)
* @brief         设置系统开关状态
* @param[in]     switch_id 设置系统开关状态的ID 
* @param[in]     data_in 设置设置系统开关状态
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void sys_switch_state_set(system_witch_e switch_id ,uint8_t data_in);

/** ****************************************************************************
* @remarks       uint8_t sys_state_state_get(system_state_e state_id)
* @brief         获取系统状态
* @param[in]     state_id 获取系统状态的ID 
* @param[out]    无
* @return        获取指定ID系统状态的值
* @attention     无
*******************************************************************************/
extern uint8_t sys_state_state_get(system_state_e state_id);

/** ****************************************************************************
* @remarks       void sys_state_state_set(system_state_e state_id ,uint8_t data_in)
* @brief         设置系统状态
* @param[in]     state_id 设置系统状态的ID
* @param[in]     data_in 设置系统状态
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void sys_state_state_set(system_state_e state_id ,uint8_t data_in);

/** ****************************************************************************
* @remarks       system_work_mode_s sys_work_mode_get(void)
* @brief         获取系统总状态
* @param[in]     无
* @param[out]    无
* @return        系统当前的状态
* @attention     无
*******************************************************************************/
extern system_work_mode_s sys_work_mode_get(void);

/** ****************************************************************************
* @remarks       void sys_work_mode_set(system_work_mode_s data_in)
* @brief         设置系统总状态
* @param[in]     data_in 设置系统总状态的参数
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void sys_work_mode_set(system_work_mode_s data_in);

/** ****************************************************************************
* @remarks       uint32_t system_wakeup_queue_set( uint32_t msg )
* @brief         设置系统唤醒消息队列信息
* @param[in]      *msg 数据源地址
* @param[out]    无
* @return        pdPASS 成功      pdFAIL 失败
* @attention     无
*******************************************************************************/
extern uint32_t system_wakeup_queue_set( uint32_t msg );

/** ****************************************************************************
* @remarks       uint32_t system_wakeup_rtc_time_set( system_rtc_wakeup_t rtc,uint32_t wakeup_time )
* @brief         设置系统唤醒定时器时间
* @param[in]     wakeup_time 设置唤醒时间，单位S。时间小于等于3600S
* @param[out]    无
* @return        pdFAIL 设置失败 pdPASS 设置成功
* @attention     必须在任务中使用
*******************************************************************************/
extern uint32_t system_wakeup_rtc_time_set( system_rtc_wakeup_t rtc,uint32_t wakeup_time );

/** ****************************************************************************
* @remarks       void system_wakeup_rtc_time_start( void )
* @brief         启动系统唤醒定时器
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void system_wakeup_rtc_time_start( void );

/** ****************************************************************************
* @remarks       void system_wakeup_rtc_time_stop( void )
* @brief         停止系统唤醒定时器时间
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void system_wakeup_rtc_time_stop( void );

/** ****************************************************************************
* @remarks       uint32_t system_wakeup_rtc_time_get( void )
* @brief         获取系统唤醒定时时间
* @param[in]     无
* @param[out]    无
* @return        无
* @attention     需要周期性调用，建议单位时间1S
*******************************************************************************/
extern uint32_t system_wakeup_rtc_time_get( void );

/** ****************************************************************************
* @remarks       void system_wakeup_event_queue_set( uint32_t msg )
* @brief         设置系统唤醒消息队列信息
* @param[in]      *msg 数据源地址
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void system_wakeup_event_queue_set( uint32_t msg );

/** ****************************************************************************
* @remarks       system_abnormal_reset_e sys_abnormal_reset_get(void)
* @brief         获取系统异常复位标志位
* @param[in]     无
* @param[out]    无
* @return        系统当前的状态
* @attention     无
*******************************************************************************/
extern system_abnormal_reset_e sys_abnormal_reset_get(void);

/** ****************************************************************************
* @remarks       void sys_abnormal_reset_set( system_abnormal_reset_e data_in )
* @brief         设置系统异常复位标志位
* @param[in]     data_in 设置参数
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void sys_abnormal_reset_set( system_abnormal_reset_e data_in );

/** ****************************************************************************
* @remarks       uint32_t sys_timestamp_delay( uint32_t* plast_timestamp, uint32_t delay )
* @brief         时间戳延时 ，单位S
* @param[in]     delay 延时时间
* @param[out]    plast_timestamp:上次到期时间戳指针
* @return        pdPASS 成功/ pdFAIL失败
* @attention     时间戳到期后自动更新上次时间戳到新时间戳
*******************************************************************************/
extern uint32_t sys_timestamp_delay( uint32_t* plast_timestamp, uint32_t delay );

#endif

